from api_server.api_recruit import ApiRecruit
from crawler_core.constant.constants import Constants
from crawler_core.constant.constants_account import ConstantAccount
from crawler_core.constant.constants_api import ConstantAPI
from crawler_core.utils.redis_utils import RedisUtils
from lib.sys.logger_factory import LoggerFactory


class TaskApiDown:
	logger = LoggerFactory.getLogger("TaskApiDown")

	@staticmethod
	def start(task_id):
		TaskApiDown.logger.info("TaskAPI -- 获取API任务 -- [%s] --" % task_id)
		# 首先获取登录 异常 信息
		r_data = RedisUtils.getApiDownloadReturn(task_id)
		if r_data:
			# 登录异常
			TaskApiDown.logger.info("TaskAPI -- 获取API任务, 登录异常，返回任务 ...")
			context = RedisUtils.getEventTask(task_id)
			r_data[Constants.API_PARAM_TENANT_ID] = context[Constants.CONTEXT_TENANT_ID]
			ApiRecruit.resume_callback(r_data)
			json_data = RedisUtils.getEventTask(task_id)
			tenant_id = json_data[Constants.API_PARAM_TENANT_ID]
			TaskApiDown.logger.info("TaskAPI -- 获取API任务 -- [%s] --, 登录异常， 删除任务 ..." % task_id)
			RedisUtils.delEventTask(task_id)
			# 移除 下载 锁定锁
			RedisUtils.removeEventDownloadLock(tenant_id)
			return
		else:
			# 获取缓存池 解析数据
			s_data = RedisUtils.getCacheDownloadData(task_id)
			if s_data:
				code = s_data[Constants.DOWNLOAD_CODE]
				if code == ConstantAPI.RETURN_ERROR_ANALYSIS:
					json_data = RedisUtils.getEventTask(task_id)
					tenant_id = json_data[Constants.API_PARAM_TENANT_ID]
					TaskApiDown.logger.info("TaskAPI -- 获取API任务 -- [%s] --, 下载完成，解析异常， 删除任务 ..." % task_id)
					# 移除下载任务和下载锁定锁
					RedisUtils.delEventTask(task_id)
					RedisUtils.removeEventDownloadLock(tenant_id)
				else:
					json_data = RedisUtils.getEventTask(task_id)
					code = s_data.get(Constants.DOWNLOAD_CODE)
					# 判断点数不够，是否存在可登录账号，重新登录下载
					if code == ConstantAPI.RETURN_ERROR_D_COUNT:
						corp_code = json_data.get(Constants.CONTEXT_CORP_CODE)
						_type = json_data.get(Constants.CONTEXT_TYPE)
						username = json_data.get(Constants.CONTEXT_USERNAME)
						RedisUtils.addEventAccount(corp_code, _type, username, ConstantAccount.STATUS_ACCOUNT_NO_COUNT)
						list_account = json_data.get(Constants.CONTEXT_ACCOUNT_LIST)
						obj = RedisUtils.getEventAccount(corp_code, _type)
						keys = obj.keys()
						if len(keys) < len(list_account):
							TaskApiDown.logger.info("TaskAPI -- 获取API任务,下载完成--点数不够，存在未使用账号，重新登录下载 ...")
							RedisUtils.setLoginTask(task_id)

					TaskApiDown.logger.info("TaskAPI -- 获取API任务, 下载完成，返回任务  ...")
					context = RedisUtils.getEventTask(task_id)
					s_data[Constants.API_PARAM_TENANT_ID] = context[Constants.CONTEXT_TENANT_ID]
					# 返回解析数据
					ApiRecruit.resume_down_callback(s_data)
					tenant_id = json_data[Constants.API_PARAM_TENANT_ID]
					TaskApiDown.logger.info("TaskAPI -- 获取API任务 -- [%s] --, 下载完成， 删除任务 ..." % task_id)

					# 移除下载任务和下载锁定锁
					RedisUtils.delEventTask(task_id)
					RedisUtils.removeEventDownloadLock(tenant_id)
					RedisUtils.removeCacheDownloadData(task_id)
					RedisUtils.removeApiDownloadReturn(task_id)
			else:
				pass